package com.yizhang.generic.demo2;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        // Cat的父类就不行
//        addExtendsAnimal(animals);

        List<Cat> cats = new ArrayList<>();
        addExtendsAnimal(cats);

        // 必须是Cat及其子类 类型通配符上限
        List<MiniCat> miniCats = new ArrayList<>();
        addExtendsAnimal(miniCats);


        addSuperAnimal(animals);
        addSuperAnimal(cats);
        // 必须是Cat及其父类 类型通配符下限
//        addSuperAnimal(miniCats);
    }

    /**
     * 类型通配符上限
     * @param animals
     */
    public static void addExtendsAnimal(List<? extends Cat> animals) {
        for (Object animal : animals) {
            System.out.println(animal);
        }
    }

    /**
     * 类型通配符下限
     * @param animals
     */
    public static void addSuperAnimal(List<? super Cat> animals) {
        // 必须用Object接收 因为不确定Cat的父类有哪些 只能用顶级父类
        for (Object animal : animals) {
            System.out.println(animal);
        }
    }
}
